home *** CD-ROM | disk | FTP | other *** search
/ PC World 2001 March / PCWorld_2001-03_cd.bin / Software / TemaCD / classbuild / ClassBuilder 2.2 PR405 Setup.exe / {app} / Include / CB_MultiOwned.h < prev    next >
C/C++ Source or Header  |  2000-04-06  |  13KB  |  389 lines

  1. #ifndef CB_MULTI_OWNED_H
  2. #define CB_MULTI_OWNED_H
  3.  
  4. #include "CB_Multi.h"
  5.  
  6. // defines for include files
  7. #define RELATION_TEMPLATE_MULTI_OWNED_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  8. public:\
  9.     ClassTo* _first##NameTo;\
  10.     ClassTo* _last##NameTo;\
  11.     int _count##NameTo;\
  12. \
  13. protected:\
  14.     void Add##NameTo##First(ClassTo* item)\
  15.     {\
  16.         METHOD_MULTI_ADDFIRST(ClassFrom, NameFrom, ClassTo, NameTo) \
  17.     }\
  18.     void Add##NameTo##Last(ClassTo* item)\
  19.     {\
  20.         METHOD_MULTI_ADDLAST(ClassFrom, NameFrom, ClassTo, NameTo) \
  21.     }\
  22.     void Add##NameTo##After(ClassTo* item, ClassTo* pos)\
  23.     {\
  24.         METHOD_MULTI_ADDAFTER(ClassFrom, NameFrom, ClassTo, NameTo) \
  25.     }\
  26.     void Add##NameTo##Before(ClassTo* item, ClassTo* pos)\
  27.     {\
  28.         METHOD_MULTI_ADDBEFORE(ClassFrom, NameFrom, ClassTo, NameTo) \
  29.     }\
  30.     void Remove##NameTo(ClassTo* item)\
  31.     {\
  32.         METHOD_MULTI_REMOVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  33.     }\
  34.     void Replace##NameTo(ClassTo* item, ClassTo* newItem)\
  35.     {\
  36.         METHOD_MULTI_REPLACE(ClassFrom, NameFrom, ClassTo, NameTo) \
  37.     }\
  38. \
  39. public:\
  40.     void DeleteAll##NameTo()\
  41.     {\
  42.         METHOD_MULTI_DELETEALL(ClassFrom, NameFrom, ClassTo, NameTo) \
  43.     }\
  44.     ClassTo* GetFirst##NameTo() const\
  45.     {\
  46.         METHOD_MULTI_GETFIRST(ClassFrom, NameFrom, ClassTo, NameTo) \
  47.     }\
  48.     ClassTo* GetLast##NameTo() const\
  49.     {\
  50.         METHOD_MULTI_GETLAST(ClassFrom, NameFrom, ClassTo, NameTo) \
  51.     }\
  52.     ClassTo* GetNext##NameTo(ClassTo* pos) const\
  53.     {\
  54.         METHOD_MULTI_GETNEXT(ClassFrom, NameFrom, ClassTo, NameTo) \
  55.     }\
  56.     ClassTo* GetPrev##NameTo(ClassTo* pos) const\
  57.     {\
  58.         METHOD_MULTI_GETPREV(ClassFrom, NameFrom, ClassTo, NameTo) \
  59.     }\
  60.     int Get##NameTo##Count() const\
  61.     {\
  62.         METHOD_MULTI_GETCOUNT(ClassFrom, NameFrom, ClassTo, NameTo) \
  63.     }\
  64.     void Move##NameTo##First(ClassTo* item)\
  65.     {\
  66.         METHOD_MULTI_MOVEFIRST(ClassFrom, NameFrom, ClassTo, NameTo) \
  67.     }\
  68.     void Move##NameTo##Last(ClassTo* item)\
  69.     {\
  70.         METHOD_MULTI_MOVELAST(ClassFrom, NameFrom, ClassTo, NameTo) \
  71.     }\
  72.     void Move##NameTo##After(ClassTo* item, ClassTo* pos)\
  73.     {\
  74.         METHOD_MULTI_MOVEAFTER(ClassFrom, NameFrom, ClassTo, NameTo) \
  75.     }\
  76.     void Move##NameTo##Before(ClassTo* item, ClassTo* pos)\
  77.     {\
  78.         METHOD_MULTI_MOVEBEFORE(ClassFrom, NameFrom, ClassTo, NameTo) \
  79.     }\
  80.     void Sort##NameTo(int (*comp)(ClassTo*, ClassTo*))\
  81.     {\
  82.         METHOD_MULTI_SORT(ClassFrom, NameFrom, ClassTo, NameTo) \
  83.     }\
  84.     ITERATOR_TEMPLATE_MULTI_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo)
  85.  
  86. #define RELATION_TEMPLATE_NOFILTER_MULTI_OWNED_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  87. public:\
  88.     ClassTo* _first##NameTo;\
  89.     ClassTo* _last##NameTo;\
  90.     int _count##NameTo;\
  91. \
  92. protected:\
  93.     void Add##NameTo##First(ClassTo* item)\
  94.     {\
  95.         METHOD_MULTI_ADDFIRST(ClassFrom, NameFrom, ClassTo, NameTo) \
  96.     }\
  97.     void Add##NameTo##Last(ClassTo* item)\
  98.     {\
  99.         METHOD_MULTI_ADDLAST(ClassFrom, NameFrom, ClassTo, NameTo) \
  100.     }\
  101.     void Add##NameTo##After(ClassTo* item, ClassTo* pos)\
  102.     {\
  103.         METHOD_MULTI_ADDAFTER(ClassFrom, NameFrom, ClassTo, NameTo) \
  104.     }\
  105.     void Add##NameTo##Before(ClassTo* item, ClassTo* pos)\
  106.     {\
  107.         METHOD_MULTI_ADDBEFORE(ClassFrom, NameFrom, ClassTo, NameTo) \
  108.     }\
  109.     void Remove##NameTo(ClassTo* item)\
  110.     {\
  111.         METHOD_MULTI_REMOVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  112.     }\
  113.     void Replace##NameTo(ClassTo* item, ClassTo* newItem)\
  114.     {\
  115.         METHOD_MULTI_REPLACE(ClassFrom, NameFrom, ClassTo, NameTo) \
  116.     }\
  117. \
  118. public:\
  119.     void DeleteAll##NameTo()\
  120.     {\
  121.         METHOD_MULTI_DELETEALL(ClassFrom, NameFrom, ClassTo, NameTo) \
  122.     }\
  123.     ClassTo* GetFirst##NameTo() const\
  124.     {\
  125.         METHOD_MULTI_GETFIRST(ClassFrom, NameFrom, ClassTo, NameTo) \
  126.     }\
  127.     ClassTo* GetLast##NameTo() const\
  128.     {\
  129.         METHOD_MULTI_GETLAST(ClassFrom, NameFrom, ClassTo, NameTo) \
  130.     }\
  131.     ClassTo* GetNext##NameTo(ClassTo* pos) const\
  132.     {\
  133.         METHOD_MULTI_GETNEXT(ClassFrom, NameFrom, ClassTo, NameTo) \
  134.     }\
  135.     ClassTo* GetPrev##NameTo(ClassTo* pos) const\
  136.     {\
  137.         METHOD_MULTI_GETPREV(ClassFrom, NameFrom, ClassTo, NameTo) \
  138.     }\
  139.     int Get##NameTo##Count() const\
  140.     {\
  141.         METHOD_MULTI_GETCOUNT(ClassFrom, NameFrom, ClassTo, NameTo) \
  142.     }\
  143.     void Move##NameTo##First(ClassTo* item)\
  144.     {\
  145.         METHOD_MULTI_MOVEFIRST(ClassFrom, NameFrom, ClassTo, NameTo) \
  146.     }\
  147.     void Move##NameTo##Last(ClassTo* item)\
  148.     {\
  149.         METHOD_MULTI_MOVELAST(ClassFrom, NameFrom, ClassTo, NameTo) \
  150.     }\
  151.     void Move##NameTo##After(ClassTo* item, ClassTo* pos)\
  152.     {\
  153.         METHOD_MULTI_MOVEAFTER(ClassFrom, NameFrom, ClassTo, NameTo) \
  154.     }\
  155.     void Move##NameTo##Before(ClassTo* item, ClassTo* pos)\
  156.     {\
  157.         METHOD_MULTI_MOVEBEFORE(ClassFrom, NameFrom, ClassTo, NameTo) \
  158.     }\
  159.     void Sort##NameTo(int (*comp)(ClassTo*, ClassTo*))\
  160.     {\
  161.         METHOD_MULTI_SORT(ClassFrom, NameFrom, ClassTo, NameTo) \
  162.     }\
  163.     ITERATOR_TEMPLATE_NOFILTER_MULTI_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo)
  164.  
  165. #define RELATION_MULTI_OWNED_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  166. public:\
  167.     ClassTo* _first##NameTo;\
  168.     ClassTo* _last##NameTo;\
  169.     int _count##NameTo;\
  170. \
  171. protected:\
  172.     void Add##NameTo##First(ClassTo* item);\
  173.     void Add##NameTo##Last(ClassTo* item);\
  174.     void Add##NameTo##After(ClassTo* item, ClassTo* pos);\
  175.     void Add##NameTo##Before(ClassTo* item, ClassTo* pos);\
  176.     void Remove##NameTo(ClassTo* item);\
  177.     void Replace##NameTo(ClassTo* item, ClassTo* newItem);\
  178. \
  179. public:\
  180.     void DeleteAll##NameTo();\
  181.     ClassTo* GetFirst##NameTo() const;\
  182.     ClassTo* GetLast##NameTo() const;\
  183.     ClassTo* GetNext##NameTo(ClassTo* pos) const;\
  184.     ClassTo* GetPrev##NameTo(ClassTo* pos) const;\
  185.     int Get##NameTo##Count() const;\
  186.     void Move##NameTo##First(ClassTo* item);\
  187.     void Move##NameTo##Last(ClassTo* item);\
  188.     void Move##NameTo##After(ClassTo* item, ClassTo* pos);\
  189.     void Move##NameTo##Before(ClassTo* item, ClassTo* pos);\
  190.     void Sort##NameTo(int (*comp)(ClassTo*, ClassTo*));\
  191.     ITERATOR_MULTI_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo)
  192.  
  193. #define RELATION_NOFILTER_MULTI_OWNED_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  194. public:\
  195.     ClassTo* _first##NameTo;\
  196.     ClassTo* _last##NameTo;\
  197.     int _count##NameTo;\
  198. \
  199. protected:\
  200.     void Add##NameTo##First(ClassTo* item);\
  201.     void Add##NameTo##Last(ClassTo* item);\
  202.     void Add##NameTo##After(ClassTo* item, ClassTo* pos);\
  203.     void Add##NameTo##Before(ClassTo* item, ClassTo* pos);\
  204.     void Remove##NameTo(ClassTo* item);\
  205.     void Replace##NameTo(ClassTo* item, ClassTo* newItem);\
  206. \
  207. public:\
  208.     void DeleteAll##NameTo();\
  209.     ClassTo* GetFirst##NameTo() const;\
  210.     ClassTo* GetLast##NameTo() const;\
  211.     ClassTo* GetNext##NameTo(ClassTo* pos) const;\
  212.     ClassTo* GetPrev##NameTo(ClassTo* pos) const;\
  213.     int Get##NameTo##Count() const;\
  214.     void Move##NameTo##First(ClassTo* item);\
  215.     void Move##NameTo##Last(ClassTo* item);\
  216.     void Move##NameTo##After(ClassTo* item, ClassTo* pos);\
  217.     void Move##NameTo##Before(ClassTo* item, ClassTo* pos);\
  218.     void Sort##NameTo(int (*comp)(ClassTo*, ClassTo*));\
  219.     ITERATOR_NOFILTER_MULTI_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo)
  220.  
  221. #define RELATION_MULTI_OWNED_PASSIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  222.     RELATION_MULTI_PASSIVE(ClassFrom, NameFrom, ClassTo, NameTo)
  223.  
  224. // defines implementation
  225. #define INIT_MULTI_OWNED_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  226.    INIT_MULTI_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo)
  227.  
  228. #define EXIT_MULTI_OWNED_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  229.     { for (ClassTo* item = GetFirst##NameTo(); item; item = GetFirst##NameTo())\
  230.           delete item; }
  231.  
  232. #define REPLACE_MULTI_OWNED_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  233.     REPLACE_MULTI_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo)
  234.  
  235. #define INIT_MULTI_OWNED_PASSIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  236.     assert(this);\
  237.     assert(p##NameFrom);\
  238.     p##NameFrom->_count##NameTo++;\
  239. \
  240.     _ref##NameFrom = p##NameFrom;\
  241. \
  242.     if (p##NameFrom->_last##NameTo)\
  243.     {\
  244.         _next##NameFrom = (ClassTo*)0;\
  245.         _prev##NameFrom = p##NameFrom->_last##NameTo;\
  246.         _prev##NameFrom->_next##NameFrom = this;\
  247.         p##NameFrom->_last##NameTo = this;\
  248.     }\
  249.     else\
  250.     {\
  251.         _prev##NameFrom = (ClassTo*)0;\
  252.         _next##NameFrom = (ClassTo*)0;\
  253.         p##NameFrom->_first##NameTo = p##NameFrom->_last##NameTo = this;\
  254.     }
  255.  
  256. #define EXIT_MULTI_OWNED_PASSIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  257.     EXIT_MULTI_PASSIVE(ClassFrom, NameFrom, ClassTo, NameTo)
  258.  
  259. #define REPLACE_MULTI_OWNED_PASSIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  260.     assert(this);\
  261.     assert(pOld);\
  262.     assert(pOld->_ref##NameFrom);\
  263.     ClassFrom##::##NameTo##Iterator::Check(pOld, this);\
  264. \
  265.     _ref##NameFrom = pOld->_ref##NameFrom;\
  266. \
  267.     if (pOld->_next##NameFrom)\
  268.         pOld->_next##NameFrom->_prev##NameFrom = this;\
  269.     else\
  270.         _ref##NameFrom->_last##NameTo = this;\
  271. \
  272.     if (pOld->_prev##NameFrom)\
  273.         pOld->_prev##NameFrom->_next##NameFrom = this;\
  274.     else\
  275.         _ref##NameFrom->_first##NameTo = this;\
  276. \
  277.     _next##NameFrom = pOld->_next##NameFrom;\
  278.     _prev##NameFrom = pOld->_prev##NameFrom;\
  279. \
  280.     pOld->_ref##NameFrom = (ClassFrom*)0;\
  281.     pOld->_next##NameFrom = (ClassTo*)0;\
  282.     pOld->_prev##NameFrom = (ClassTo*)0;
  283.  
  284. #define REMOVE_MULTI_OWNED_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  285.     { for (ClassTo* item = GetFirst##NameTo(); item; item = GetFirst##NameTo())\
  286.           (void)new UndoSubDelete(item); }
  287.  
  288. #define SAVE_MULTI_OWNED_PASSIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  289.     SAVE_MULTI_PASSIVE(ClassFrom, NameFrom, ClassTo, NameTo)
  290.  
  291. #define RESTORE_MULTI_OWNED_PASSIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  292.     RESTORE_MULTI_PASSIVE(ClassFrom, NameFrom, ClassTo, NameTo)
  293.  
  294. #define REMOVE_MULTI_OWNED_PASSIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  295.     REMOVE_MULTI_PASSIVE(ClassFrom, NameFrom, ClassTo, NameTo)
  296.  
  297. #define CLEANUP_MULTI_OWNED_PASSIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  298.     CLEANUP_MULTI_PASSIVE(ClassFrom, NameFrom, ClassTo, NameTo)
  299.  
  300. #define METHODS_MULTI_OWNED_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  301. void ClassFrom##::Add##NameTo##First(ClassTo* item)\
  302. {\
  303.     METHOD_MULTI_ADDFIRST(ClassFrom, NameFrom, ClassTo, NameTo) \
  304. }\
  305. \
  306. void ClassFrom##::Add##NameTo##Last(ClassTo* item)\
  307. {\
  308.     METHOD_MULTI_ADDLAST(ClassFrom, NameFrom, ClassTo, NameTo) \
  309. }\
  310. \
  311. void ClassFrom##::Add##NameTo##After(ClassTo* item, ClassTo* pos)\
  312. {\
  313.     METHOD_MULTI_ADDAFTER(ClassFrom, NameFrom, ClassTo, NameTo) \
  314. }\
  315. \
  316. void ClassFrom##::Add##NameTo##Before(ClassTo* item, ClassTo* pos)\
  317. {\
  318.     METHOD_MULTI_ADDBEFORE(ClassFrom, NameFrom, ClassTo, NameTo) \
  319. }\
  320. \
  321. void ClassFrom##::Remove##NameTo(ClassTo* item)\
  322. {\
  323.     METHOD_MULTI_REMOVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  324. }\
  325. \
  326. void ClassFrom##::DeleteAll##NameTo()\
  327. {\
  328.     METHOD_MULTI_DELETEALL(ClassFrom, NameFrom, ClassTo, NameTo) \
  329. }\
  330. \
  331. void ClassFrom##::Replace##NameTo(ClassTo* item, ClassTo* newItem)\
  332. {\
  333.     METHOD_MULTI_REPLACE(ClassFrom, NameFrom, ClassTo, NameTo) \
  334. }\
  335. \
  336. ClassTo* ClassFrom##::GetFirst##NameTo() const\
  337. {\
  338.     METHOD_MULTI_GETFIRST(ClassFrom, NameFrom, ClassTo, NameTo) \
  339. }\
  340. \
  341. ClassTo* ClassFrom##::GetLast##NameTo() const\
  342. {\
  343.     METHOD_MULTI_GETLAST(ClassFrom, NameFrom, ClassTo, NameTo) \
  344. }\
  345. \
  346. ClassTo* ClassFrom##::GetNext##NameTo(ClassTo* pos) const\
  347. {\
  348.     METHOD_MULTI_GETNEXT(ClassFrom, NameFrom, ClassTo, NameTo) \
  349. }\
  350. \
  351. ClassTo* ClassFrom##::GetPrev##NameTo(ClassTo* pos) const\
  352. {\
  353.     METHOD_MULTI_GETPREV(ClassFrom, NameFrom, ClassTo, NameTo) \
  354. }\
  355. \
  356. int ClassFrom##::Get##NameTo##Count() const\
  357. {\
  358.     METHOD_MULTI_GETCOUNT(ClassFrom, NameFrom, ClassTo, NameTo) \
  359. }\
  360. \
  361. void ClassFrom##::Move##NameTo##First(ClassTo* item)\
  362. {\
  363.     METHOD_MULTI_MOVEFIRST(ClassFrom, NameFrom, ClassTo, NameTo) \
  364. }\
  365. \
  366. void ClassFrom##::Move##NameTo##Last(ClassTo* item)\
  367. {\
  368.     METHOD_MULTI_MOVELAST(ClassFrom, NameFrom, ClassTo, NameTo) \
  369. }\
  370. \
  371. void ClassFrom##::Move##NameTo##After(ClassTo* item, ClassTo* pos)\
  372. {\
  373.     METHOD_MULTI_MOVEAFTER(ClassFrom, NameFrom, ClassTo, NameTo) \
  374. }\
  375. \
  376. void ClassFrom##::Move##NameTo##Before(ClassTo* item, ClassTo* pos)\
  377. {\
  378.     METHOD_MULTI_MOVEBEFORE(ClassFrom, NameFrom, ClassTo, NameTo) \
  379. }\
  380. \
  381. void ClassFrom##::Sort##NameTo##(int (*comp)(ClassTo*, ClassTo*))\
  382. {\
  383.     METHOD_MULTI_SORT(ClassFrom, NameFrom, ClassTo, NameTo) \
  384. }
  385.  
  386. #define METHODS_MULTI_OWNED_PASSIVE(ClassFrom, NameFrom, ClassTo, NameTo)
  387.  
  388. #endif
  389.